package br.ucb.ProjetoFinal.view;

import br.ucb.ProjetoFinal.bean.ApresentacaoEmpreendimento;
import br.ucb.ProjetoFinal.domain.Empreendimento;
import br.ucb.ProjetoFinal.service.EmpreendimentoService;
import java.io.Serializable;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

/*
 * Managed bean responsavel pelo caso de uso MANTER EMPREENDIMENTO
 */
@ManagedBean(name="managedEmpreendimento")
@SessionScoped
public class ManagedEmpreendimento implements Serializable{

//////////////////////////////////ATRIBUTOS/////////////////////////////////////
    @EJB
    private EmpreendimentoService service;
    private Empreendimento emp;
    //Usado tanto no cadastro quanto nas consultas, para armazenar o valor dos campos
    private ApresentacaoEmpreendimento aprEmp;
    //Esta LIST receberá os vários empreendimentos cadastrados, na hora da pesquisa
    private List<Empreendimento> empreendimentos;
    
    //Usado na CONSULTA
    private String numRadioPesquisa;
    private String situacao;

////////////////////////////////////////////////////////////////////////////////

    public ManagedEmpreendimento() {
        //Seta o valor inicial para os radio-buttons na pagina da consulta
        setNumRadioPesquisa("cod");
        setAprEmp(new ApresentacaoEmpreendimento());
    }

    //METODO USADO PARA O CADASTRO DOS EMPREENDIMENTOS//////////////////////////
        public String submeter(){
            if(service.getMunicipio(aprEmp.getMunicipio()) == null){
                    FacesMessage fm = new FacesMessage("O municipio selecionado não existe");
                    FacesContext.getCurrentInstance().addMessage("Operação inválida", fm);
                    return "cadastraEmpr";
            }
           service.insertEmpreendimento(converte());

            return "cadSucesso";
        }
    // FIM DO METODO////////////////////////////////////////////////////////////


    // METODO USADO PARA PESQUISA DE EMPREENDIMENTOS////////////////////////////
        public String procurar(){
            //Se nenhum dos campos for informado....
            if(numRadioPesquisa.equals("filtro") && aprEmp.getSituacao() == null && aprEmp.getMunicipio() == null){
                FacesMessage fm = new FacesMessage("O usuário deve preencher pelo menos um dos campos ou selecionar a opção para pesquisar todos");
                FacesContext.getCurrentInstance().addMessage("Operação inválida", fm);
                return "consultaEmpr";
            }
            
            service.getEmpreendimentos(aprEmp.getCodApf(),aprEmp.getNomeEmpr(),aprEmp.getMunicipio());
            //Se o array estiver vazio, significa que não foram encontrados resultados
            if(getEmpreendimentos().isEmpty())
                return "semResults";
            else
                return "listEmpr";
        }
    // FIM DO METODO////////////////////////////////////////////////////////////
        
    // METODO USADO PARA PESQUISA DE EMPREENDIMENTOS////////////////////////////
        public String procurarTodos(){
             setEmpreendimentos(service.getEmpreendimentos());
            //Se o array estiver vazio, significa que não foram encontrados resultados
            if(getEmpreendimentos().isEmpty())
                return "semResults";
            else
                return "listEmpr";
        }
    // FIM DO METODO////////////////////////////////////////////////////////////


    // METODO USADO PARA DETALHAR UM EMPREENDIMENTO/////////////////////////////
        public String detalhar(){
            String index = (String)FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("index");
            setEmp(getEmpreendimentos().get(Integer.parseInt(index)));

            setSituacao(transformaSituacao(getEmp().getIcSituacao()));
            return "detalhaEmp";
        }
    // FIM DO METODO////////////////////////////////////////////////////////////
        
     // METODO USADO PARA LIMPAR CHECKBOXES/////////////////////////////////////
        public void limparCheck(){
            getAprEmp().setSituacao(null);
        }
     //FIM DO METODO////////////////////////////////////////////////////////////
        
     // METODO USADO PARA CONVERTER UM OBJETO APRESENTACAOEMPREENDIMENTO EM EMPREENDIMENTO(DO DOMAIN)///
        public Empreendimento converte(){
            aprEmp.filtraApf();
            return( 
                new Empreendimento(aprEmp.getCodApf(),aprEmp.getNomeEmpr(),aprEmp.getDigVerificadorApf(),
                                     aprEmp.getQtdeUnidadesDisponiveis(),aprEmp.getQtdeMaxIndicacoes(),aprEmp.getQtdeMinIndicacoes(),'S',
                                     aprEmp.getSituacao(),null,service.getMunicipio(aprEmp.getMunicipio()),null)
            );
        }
     //FIM DO METODO////////////////////////////////////////////////////////////
        
     // METODO USADO PARA GERAR UMA STRING PARA A SITUACAO///
        public String transformaSituacao(Character sit){
            if(getEmp().getIcSituacao()!=null){
                if(sit.equals('1'))
                    return "Ativo";
                if(sit.equals('2'))
                    return "Fechado";
                
                return "Desconhecido";
            }
            else
                return "Não informado";
        }
     //FIM DO METODO////////////////////////////////////////////////////////////
     

    //FUNÇÕES USADAS PARA IR PARA A PAGINA DE CADASTRO E PARA A PAGINA DE BUSCA, RESPECTIVAMENTE
        public String cadastraEmp(){
            setAprEmp(new ApresentacaoEmpreendimento());

            return "cadastraEmpr";
        }
        public String consultaEmp(){
            setAprEmp(new ApresentacaoEmpreendimento());

            return "consultaEmpr";
        }
    //FIM DAS FUNÇÕES///////////////////////////////////////////////////////////



//GETTERS & SETTERS/////////////////////////////////////////////////////////////

    public void setAprEmp(ApresentacaoEmpreendimento aprEmp) {
        this.aprEmp = aprEmp;
    }

    public ApresentacaoEmpreendimento getAprEmp() {
        return aprEmp;
    }
    public void setEmpreendimentos(List<Empreendimento> empreendimentos) {
        this.empreendimentos = empreendimentos;
    }

    public List<Empreendimento> getEmpreendimentos() {
        return empreendimentos;
    }

    public Empreendimento getEmp() {
        return emp;
    }

    public void setEmp(Empreendimento emp) {
        this.emp = emp;
    }
    
    public void setNumRadioPesquisa(String numRadioPesquisa) {
        this.numRadioPesquisa = numRadioPesquisa;
    }

    public String getNumRadioPesquisa() {
        return numRadioPesquisa;
    }

    public void setSituacao(String situacao) {
        this.situacao = situacao;
    }

    public String getSituacao() {
        return situacao;
    }
}
